import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.dates as mdates
from datetime import datetime

# 读取Excel文件
file_path = 'dataset/失业率.xlsx'
sheet_name = '月度数据'
df = pd.read_excel(file_path, sheet_name=sheet_name, header=2)  # 跳过前两行

# 提取指标名称
indicators = df['指标'].tolist()

# 提取日期列
dates = df.columns[1:].tolist()
date_series = pd.to_datetime([date.replace('年', '-').replace('月', '') for date in dates])

# 创建日期范围（从最早日期到最晚日期）
start_date = date_series.min()
end_date = date_series.max()
all_dates = pd.date_range(start=start_date, end=end_date, freq='D')

# 创建空的DataFrame用于存储所有指标的每日数据
full_daily_data = pd.DataFrame({'日期': all_dates})

# 设置绘图风格
# plt.style.use('seaborn')
plt.rcParams['font.sans-serif'] = ['SimHei']  # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False  # 用来正常显示负号

# 创建图形保存目录
import os
if not os.path.exists('失业率图表'):
    os.makedirs('失业率图表')

# 对每个指标进行插值处理和可视化
for indicator in indicators:
    # 提取当前指标的数据
    indicator_data = df[df['指标'] == indicator].iloc[:, 1:].T
    indicator_data.columns = [indicator]
    
    # 创建临时DataFrame
    temp_df = pd.DataFrame({'日期': date_series, indicator: indicator_data[indicator].values})
    
    # 合并到完整日期范围
    temp_df = pd.merge(full_daily_data[['日期']], temp_df, on='日期', how='left')
    
    # 线性插值
    temp_df[indicator] = temp_df[indicator].interpolate(method='linear')
    
    # 填充首尾可能存在的NaN值
    temp_df[indicator] = temp_df[indicator].fillna(method='bfill').fillna(method='ffill')
    
    # 添加到完整数据集
    full_daily_data = pd.merge(full_daily_data, temp_df, on='日期', how='left')
    
    # 绘制折线图
    plt.figure(figsize=(12, 6))
    plt.plot(temp_df['日期'], temp_df[indicator], marker='o', markersize=4, linestyle='-', linewidth=2)
    
    # 设置图表标题和标签
    plt.title(f'{indicator} 每日数据趋势', fontsize=14)
    plt.xlabel('日期', fontsize=12)
    plt.ylabel(indicator.split('(')[0], fontsize=12)
    
    # 设置x轴日期格式
    plt.gca().xaxis.set_major_formatter(mdates.DateFormatter('%Y-%m'))
    plt.gca().xaxis.set_major_locator(mdates.MonthLocator(interval=3))
    plt.gcf().autofmt_xdate()  # 自动旋转日期标签
    
    # 添加网格
    plt.grid(True, linestyle='--', alpha=0.6)
    
    # 保存图表
    chart_path = f'失业率图表/{indicator.replace("/","_").replace("(","").replace(")","")}_趋势图.png'
    plt.savefig(chart_path, bbox_inches='tight', dpi=300)
    plt.close()
    
    print(f'已生成 {indicator} 的图表: {chart_path}')

# 保存所有指标的每日数据到CSV
output_file = 'dataset_csv/每日失业率数据.csv'
full_daily_data.to_csv(output_file, index=False, encoding='utf-8-sig')

print(f'\n所有指标的每日数据已保存到 {output_file}')
print('处理完成！')